/**
 * @fileoverview   dom/attr  元素属性，内容设置，获取

 * @date: 11-11-4
 * @time: 上午10:33
 * @author 2kid
 * @version 0.001
 */
/**
 *
 *
 * 方法：
 * dom.prototype.attr
 * dom.prototype.hasclass
 * dom.prototype.addclass
 * dom.prototype.removeclass
 * dom.prototype.val
 * dom.prototype.text
 * dom.prototype.html
 * 方法：
 * dom.query
 *
 */
F.reg('dom/attr', function (f, dom) {
    var win = window, doc = win['document'], docElement = doc.documentElement;

    f.extend(dom, {
        /**
         * @name F.Dom.prototype.attr
         * @function
         * @namespace 设置或获取属性，不能设置class属性请用addclass，style属性请用css，不能设置on...等事件
         * @param {String | Object} name  String如果第二个参数设置了，则设置属性，否则获取第一个元素的属性 |
         *                                 Object设置多个属性
         * @param {String} value
         * @return {Object | string}
         * @example
         * 例子：
         * 1.
         * //设置所有的a元素的href为#
         * dom.query('a').attr('href','#');
         * 2.
         * //获取第一个a元素的href
         * dom.query('a').attr('href');
         * 3.
         * //设置自定义属性
         * dom.query('div').attr({data1:123,data2:456});
         */
        attr:function (name, value) {
            function set(ele, k, v) {
                if (k in ele) {
                    ele[k] = v;
                } else {
                    ele.setAttribute(k, v);
                }
            }

            function get(ele, k) {
                if (k in ele) {
                    return ele[k];
                }
                return ele.getAttribute(k, 2)
            }

            if (f.type(name, 'string')) {
                if (!f.type(value, 'undefined')) {
                    f.each(this.get(), function (ele) {
                        set(ele, name, value);
                    }, this);
                } else {
                    if (this.get().length > 0) {
                        return get(this.get(0), name);
                    }
                }
            } else if (f.type(name, 'object')) {
                f.each(this.get(), function (ele) {
                    f.each(name, function (v, k) {
                        set(ele, k, v);
                    }, this);
                }, this);
            }
            return this;
        },
        /**
         * @name F.Dom.prototype.hasclass
         * @function
         * @namespace 检查匹配的元素是否有 classname
         * @param name classname
         * @return {Boolean}
         * @example
         * 例子：
         * 1.
         * //如果所有的a元素都有 foo 类，则返回 true
         * dom.query('a').hasclass('foo');
         */
        hasclass:function (name) {
            var returnval = false;
            if (f.type(name, 'string')) {
                f.each(this.get(), function (ele) {
                    var oldclassarr = ele.className.match(/\S+/g) || [];
                    returnval = f.inarray(oldclassarr, name) > -1;
                }, this);
            }
            return returnval;
        },
        /**
         * @name F.Dom.prototype.addclass
         * @function
         * @namespace 添加class
         * @param {String } name  类名，可添加多个，中间使用空格
         * @return {Object} Dom对象
         * @example
         * 例子：
         * 1.
         * //给所有的a元素添加foo,occ类
         * dom.query('a').addclass('foo occ');
         */
        addclass:function (name) {
            if (f.type(name, 'string')) {
                f.each(this.get(), function (ele) {
                    var oldclass = ele.className, oldclassarr = oldclass.match(/\S+/g) || [];
                    f.each(name.match(/\S+/g), function (nclass) {
                        if (f.inarray(oldclassarr, nclass) === -1) {
                            oldclass += ' ' + nclass;
                        }
                    }, this);
                    ele.className = oldclass;
                }, this);
            }
            return this;
        },
        /**
         * @name F.Dom.prototype.removeclass
         * @function
         * @namespace 删除class
         * @param {String } name  类名，可选，可删除多个，中间使用空格，不传值，则删除所有的classname
         * @return {Object} Dom对象
         * @example
         * 例子：
         * 1.
         * //删除所有的a元素foo,occ类
         * dom.query('a').removeclass('foo occ');
         * 2.
         * //删除所有a元素的类
         * dom.query('a').removeclass('');
         */
        removeclass:function (name) {
            if (f.type(name, 'string')) {
                f.each(this.get(), function (ele) {
                    var oldclass = ele.className, oldclassarr = oldclass.match(/\S+/g) || [];
                    //遍历每个class
                    f.each(name.match(/\S+/g), function (nclass) {
                        var i = f.inarray(oldclassarr, nclass);
                        if (i > -1) {
                            oldclassarr.splice(i, 1);
                        }
                    }, this);
                    ele.className = oldclassarr.join(' ');
                }, this);
            } else {
                f.each(this.get(), function (ele) {
                    ele.className = '';
                });

            }
            return this;
        },
        /**
         * @name F.Dom.prototype.val
         * @function
         * @namespace 设置或获取css样式,
         * 获取或设置表单元素的值。单选和复选框，下拉选择框最好设置value属性。要获取是否选中按钮，请用attr('checked')
         * @param v 可选，设置的值
         * @return {Object | string}
         * @example
         * 例子：
         * 1.
         * //获取第一个input元素的 value
         * dom.query('input').val();
         * 2.
         * //设置所有input元素的 value
         * dom.query('input').val('abc');
         */
        val:function (v) {
            var elem = this.get(), val = '';

            if (f.type(v, 'string')) {
                f.each(elem, function (ele) {
                    ele.value = v;
                });
            } else {
                var ele = elem[0], options = ele.options;
                //如果是多选返回数组
                if (ele.type !== 'select-one') {
                    var ret = [], i = 0, len = options.length;
                    for (; i < len; ++i) {
                        if (options[i].selected) {
                            ret.push(options[i].value);
                        }
                    }
                    val = ret;
                } else {
                    val = ele.value;
                }
                return val;
            }
            return this;
        },
        /**
         * @name F.Dom.prototype.text
         * @function
         * @namespace 设置或获取元素的文本
         * @param v 可选，设置的值
         * @return {Object | string}
         * @example
         * 例子：
         * 1.
         * //获取第一个 div 元素的 text
         * dom.query('div').text();
         * 2.
         * //设置所有 div 元素的 text
         * dom.query('div').text('abc');
         */
        text:function (v) {
            var TEXT = 'innerText' in docElement ? 'innerText' : 'textContent';
            if (f.type(v, 'undefined')) {
                return this.get(0)[TEXT];
            } else {
                f.each(this.get(), function (ele) {
                    ele[TEXT] = v;
                });
            }
            return this;
        },
        /**
         * @name F.Dom.prototype.html
         * @function
         * @namespace 设置或获取元素html
         * @param v 可选，设置的值
         * @return {Object | string}
         * @example
         * 例子：
         * 1.
         * //获取第一个 div 元素的 html
         * dom.query('div').html();
         * 2.
         * //设置所有 div 元素的 html
         * dom.query('div').html('<a href="">abc</a>');
         *
         */
        html:function (v) {
            if (f.type(v, 'undefined')) {
                return this.get(0).innerHTML;
            } else {
                f.each(this.get(), function (ele) {
                    ele.innerHTML = v;
                });
            }
            return this;
        }

    });


    return dom;
}, {

});